import store from '@/store'
import * as util from '@/utils/util'
import { paginate } from '@/common/constant'
import Config from '@/core/config'
// 图片地址
const imgDomain = Config.get('imgDomain')

/**
 * 显示成功提示框
 */
export const showSuccess = (msg, callback) => {
  uni.showToast({
    title: msg,
    icon: 'success',
    mask: true,
    duration: 1500,
    success() {
      callback && callback()
    }
  })
}

/**
 * 显示失败提示框
 */
export const showError = (msg, callback) => {
  uni.showModal({
    title: '友情提示',
    content: msg,
    showCancel: false,
    success(res) {
      callback && callback()
    }
  })
}

/**
 * 二次确认通用方法
 */
export const showConfirm = (callback, params) => {
  uni.showModal({
    title: params.title || '提示',
    content: params.content,
    confirmText: params.confirmText || '确定',
    cancelText: params.cancelText || '取消',
    success: res => {
      if (res.confirm) {
        callback && callback()
      }
    }
  })
}

/**
 * 显示纯文字提示框
 */
export const showToast = (msg, duration = 1500, mask = true) => {
  uni.showToast({
    title: msg, // 提示的内容
    icon: 'none',
    mask, // 是否显示透明蒙层，防止触摸穿透 (支付宝小程序不支持)
    duration // 提示的延迟时间，单位毫秒，默认：1500
  })
}

/**
 * tabBar页面路径列表 (用于链接跳转时判断)
 * tabBarLinks为常量, 无需修改
 */
export const getTabBarLinks = () => {
  const tabBarLinks = [
    'pages/home/index',
    'pages/order/index',
    'pages/message/index',
    'pages/apply/index',
    'pages/user/index'
  ]
  return tabBarLinks
}

/**
 * 生成完整的H5地址 [带参数]
 * @param {string} baseUrl H5访问地址
 * @param {string} path 页面路径
 * @param {object} params 页面参数
 * @return {string}
 */
export const buildUrL = (h5Url, path, params) => {
  let complete = h5Url
  if (!util.isEmpty(path)) {
    complete += '#/' + path
    const shareParamsStr = getShareUrlParams(params)
    if (!util.isEmpty(shareParamsStr)) {
      complete += '?' + shareParamsStr
    }
  }
  return complete
}

/**
 * 生成转发的url参数(string格式)
 * @param {object} params
 * @return {string}
 */
export const getShareUrlParams = params => {
  return util.urlEncode(getShareParams(params))
}

/**
 * 生成转发的url参数(object格式)
 * @param {object} params
 * @return {object}
 */
export const getShareParams = params => {
  return { ...params }
}

/**
 * 跳转到指定页面url
 * 支持tabBar页面
 * @param {string}  url   页面路径
 * @param {object}  query 页面参数
 * @param {string}  modo  跳转类型(默认navigateTo)
 */
export const navTo = (url, query = {}, modo = 'navigateTo') => {
  if (!url || url.length == 0) {
    return false
  }
  // tabBar页面, 使用switchTab
  if (util.inArray(url, getTabBarLinks())) {
    uni.switchTab({
      url: `/${url}`
    })
    return true
  }
  // 生成query参数
  const queryStr = !util.isEmpty(query) ? '?' + util.urlEncode(query) : ''
  // 普通页面, 使用navigateTo
  modo === 'navigateTo' && uni.navigateTo({
    url: `/${url}${queryStr}`
  })
  // 特殊指定, 使用redirectTo
  modo === 'redirectTo' && uni.redirectTo({
    url: `/${url}${queryStr}`
  })
  // 关闭所有页面, 打开指定页面
  modo === 'reLaunch' && uni.reLaunch({
    url: `/${url}${queryStr}`
  })
  return true
}

/**
 * 获取当前页面数据
 * @param {object}
 */
export const getCurrentPage = () => {
  const pages = getCurrentPages()
  const pathInfo = pages[pages.length - 1].$page.fullPath.split('?')
  return { path: pathInfo[0].slice(1), query: util.urlDecode(pathInfo[1]) }
}

/**
 * 设置用户中心message未读消息的角标
 * 该方法只能在tabbar页面中调用, 其他页面调用会报错
 * @param {number} total 数量
 * @param {number} tabbarIndex tabbar索引
 */
export const setTabBadge = (total, tabbarIndex) => {
  if (total > 0) {
    uni.setTabBarBadge({
      index: tabbarIndex,
      text: `${total > 99 ? '99+' : total}`,
      fail: (e)=> {console.log(e)}
    })
  } else {
    uni.removeTabBarBadge({
      index: tabbarIndex,
      fail: (e)=> {console.log(e)}
    })
  }
}

/**
 * 验证是否已登录
 */
export const checkLogin = () => {
  return !!store.getters.token
}

/**
 * 返回分页数据结构
 */
export const getEmptyPaginateObj = () => {
  return util.cloneObj(paginate)
}

/**
 * 加载更多列表数据
 * @param {Object} resList 新列表数据
 * @param {Object} oldList 旧列表数据
 * @param {int} current 当前页码
 */
export const getMoreListData = (resList, oldList, current) => {
  // 如果是第一页需手动制空列表
  if (current === 1) oldList = []
  // 合并新数据
  return oldList.concat(resList)
}

/**
 * scene解码
 * 用于解码微信小程序二维码参数,并返回对象
 */
export const sceneDecode = (str) => {
  if (str === undefined)
    return {}
  const data = {}
  const params = decodeURIComponent(str).split(',')
  for (const i in params) {
    const val = params[i].split(':');
    val.length > 0 && val[0] && (data[val[0]] = val[1] || null)
  }
  return data
}

/**
 * 获取二维码场景值(scene)
 */
export const getSceneData = query => {
  return util.hasOwnProperty(query, 'scene') ? sceneDecode(query.scene) : {}
}

/**
 * 验证指定的功能模块是否开启
 */
export const checkModuleKey = moduleKey => {
  return util.inArray(moduleKey, store.getters.permissions)
}

/**
 * 验证指定的功能模块是否开启（批量）
 */
export const checkModules = moduleKeys => {
  return moduleKeys.filter(val => checkModuleKey(val)).length > 0
}

/**
 * 过滤开启的功能模块（批量）
 */
export const filterModules = array => {
  return array.filter(item => !item.moduleKey || checkModuleKey(item.moduleKey))
}

/**
 * 图片路径转换
 * @param {String} path 图片地址
 * @param {Object} params 参数，针对商品、相册里面的图片区分大中小
 * 	params: {
 * 		size: big、mid、small,
 * 		w: 图片宽度,
 * 		h: 图片高度,
 * 	}
 */
export const image = (path, params = undefined) => {
  if (!path) return ''
  let suffix = ''
  if (params) {
    if (params.size) {
      if ('small' === params.size) {
        suffix = 'x-oss-process=image/resize,w_100,limit_0'
      } else if ('mid' === params.size) {
        suffix = 'x-oss-process=image/resize,w_300,limit_0'
      } else if ('canvas' === params.size) {
        suffix = 'x-oss-process=image/resize,w_400,limit_0'
      }
    } else if (params.w && params.h) { // 宽高缩放
      let w = params.w
      let h = params.h
      // 缩放比例
      const scale = params.scale || 0.9
      w = Math.floor(w * scale)
      h = Math.floor(h * scale)
      suffix = `x-oss-process=image/resize,w_${w},h_${h},limit_0`
    }
  }
  if (path.indexOf('https') === -1 && path.indexOf('http') === -1) {
    path = `${imgDomain}${path}`
  }
  if (suffix) {
    path = `${path}?${suffix}`
  }
  return path
}
